# 登录接口测试
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase, Parameters
import allure
import csv
import pytest


@allure.epic("管理员登录互帮互助管理系统")  # 项目级标签
@allure.feature("用户认证模块")  # 模块级标签
@allure.story("登录接口")   # 接口名称
# @allure.title("用户名密码正确，登录成功")   # 用例标题
class TestCaseLogin(HttpRunner):

    config = (
        Config("参数化用户名密码正确，登录成功")  # 设置测试用例名称为"参数化用户名密码正确，登录成功"
        # 设置基础URL（从config模块读取）
        .base_url("${read_config()}")
        .variables(**{
            # 定义用例级变量
            "username": "admin",
            "password": "8i4De25KlVQVwqTDgTNGqw=="
            # csv参数化
            # "username-password-expected_status": "${read_csv(data.csv)}"
        })
        # 关闭SSL证书验证（仅测试环境用）
        .verify(False)
        # 导出变量供其他用例使用
        .export(*["token"])
    )

    teststeps = [
        Step(
            # 步骤名称（日志中显示）
            RunRequest("密码登录")
            # POST请求，路径拼接在base_url后
            .post("/api/user/login")
            .with_json({
                # 引用config中的变量
                "username": "$username",
                # 调用md5加密密码（格式：${md5(明文)}）
                "password": "$password"
            })
            # 提取响应数据
            .extract()
            # 从JSON中提取token并存储到变量
            .with_jmespath("body.token", "token")
            # 断言区块
            .validate()
            # 验证状态码
            .assert_equal("status_code", 200)
            # 验证token长度为32
            # .assert_length_equal("body.token", 32)
            # 验证响应时间<500ms
            # .assert_less_than("body.time_used", 500)  # 响应时间<500ms
        )
    ]

    # 使用正确的参数化格式
    parameters = {
        "username-password-expected_status": "${read_csv(data.csv)}"
    }

    @pytest.mark.parametrize("param", Parameters(parameters))
    def test_start(self, param):
        super().test_start(param)
